package com.stars.services;

import com.stars.common.base.ResultMsg;
import com.stars.common.chart.CharDTO;
import com.stars.common.chart.DataDTO;
import com.stars.common.enums.AutoCodeTypeEnum;

import java.util.List;
import java.util.Map;

/**
 * Created by luodajie on 2019/1/5.
 *  查询
 */
public interface BaseAccessService<T> {
    /**
     * 根据实体中的属性进行查询，只能有一个返回值，有多个结果是抛出异常，查询条件使用等号
     * @param entity
     * @return
     */
    T selectOne(T entity);

    /**
     * 根据主键字段进行查询，方法参数必须包含完整的主键属性，查询条件使用等号
     * @param id
     * @return
     */
    T selectById(Object id);

    /**
     * 根据实体中的属性值进行查询，查询条件使用等号
     * @param entity
     * @return
     */
    List<T> selectList(T entity);

    /**
     * 根查询全部结果，select(null)方法能达到同样的效果
     * @return
     */
    List<T> selectListAll();

    /**
     * 根据实体中的属性查询总数，查询条件使用等号
     * @param entity
     * @return
     */
    Long selectCount(T entity);

    /**
     * 根据Example条件进行查询
     * 重点：这个查询支持通过Example类指定查询列，通过selectProperties方法指定查询列
     * @param example
     * @return
     */
    List<T> selectByExample(Object example);

    /**
     * 根据Example条件进行查询总数
     * @param example
     * @return
     */
    int selectCountByExample(Object example);

    /**
     * 计数
     * @param tableName 表名
     * @param columnsName 列名
     * @param whereColumns 查询条件 如   name ='3222' AND age =2
     * @return
     */
    ResultMsg countByTableColumns(String tableName, String columnsName, String whereColumns, String chartType);

   /** 
    * @Description: 求和
    * @Param: [tableName, columnsName, whereColumns]
    * @return: java.util.List<java.util.Map<java.lang.String,java.lang.Double>>
    * @Author: dj
    * @Date: 2019/10/31
    */
   ResultMsg sumByTableColumns(String tableName,String columnsName,Map<String,String> colMap,String whereColumns, String chartType);
    /**
     * 统一格式
     * @param tableName 表名
     * @param columnsNameMap 列名+标题
     * @param whereColumns 查询条件 如   name ='3222' AND age =2
     * @return
     */
    List<DataDTO> charCount(String tableName, Map<String,String> columnsNameMap, String whereColumns);
    /**
     * 统一格式
     * @param tableName
     * @param columnsName
     * @param colMap
     * @param whereColumns
     * @return
     */
    List<DataDTO>  charSum(String tableName, String columnsName, Map<String,String> colMap, String whereColumns);

    /**
     *@Param: tableName 表名
     *@Param: dictCode id
     *@Param: columnsName 名称
     * @return
     * @throws Exception
     */
    Map<String, Object> findDictTableToMap(String tableName,String dictCode,String columnsName) throws Exception;

    /**
     *  校验是否重复
     * @param tableName 表
     * @param map <"id","12312312"> 验证的字段
     * @return
     * @throws Exception
     */
    Integer fieldRepeatVail(String tableName, Map<String,String> map) throws Exception;

    /**
     * 自动生成流水号（格式:业务码+时间+当天4位自增号）
     * @param tableName  表
     * @param columnsName 流水号字段
     * @param prefix 前缀
     * @param typeEnum 查询方式
     * @param dbWhereStr 查询列
     * @param dbWhereVal 查询值
     * @return 自动生成流水号
     * @throws Exception
     */
    String createCode(String tableName, String columnsName, String prefix, AutoCodeTypeEnum typeEnum,String dbWhereStr, String dbWhereVal) throws Exception;
}
